Node.js 的内置模块出了前面详细介绍的一些高频常用模块外,还存在许多其它的模块 (日常直接使用频率相对低一点)。

这一节挑选了如下 4 个模块进行简单介绍 URLTimersReadlineCrypto

1 url 模块

1.1 url.parse

url.parse 解析 URL 字符串,返回一个解析后的对象。

```js import url from 'url'

const testUrl = 'https://www.baidu.com?search=juejin' console.log(url.parse(testUrl)) ```

1.2 URL

url.URL 和全局的 URL 一样,创建一个 URL 实例,提供许多开箱即用的操作。

```js import url from 'url'

const testUrl = 'https://www.baidu.com?search=juejin' console.log('url.URL === URL', url.URL === URL) console.log(new URL(testUrl)) ```

其中 searchParams 提供了可直接操作查询参数的一些方法。

2 Timers

定时器相关方法。

| 方法名 | 描述 | | ----------------------------------------- | ----------------------------- | | setTimeout(callback, delay[, ...args]) | 在 delay 毫秒之后执行一次 callback | | setInterval(callback, delay[, ...args]) | 每隔 delay 毫秒执行一次 callback | | setImmediate(callback[, ...args]) | 在当前事件循环的下一个阶段执行 callback | | process.nextTick(callback[, ...args]) | 在当前事件循环结束后立即执行 callback |

示例代码如下。

js setImmediate(() => console.log('setImmediate')) setTimeout(() => console.log('setTimeout'), 0) process.nextTick(() => console.log('nextTick')) setInterval(() => console.log('setInterval'), 1000)

3 Readline 模块

在 Node.js 中,readline 模块提供了一个接口,用于从可读流 (例如 process.stdin) 读取数据,并支持逐行读取数据。

下面是几个例子:

3.1 question

① 使用 question() 方法向用户询问姓名并显示。

```js import readline from 'readline'

const rl = readline.createInterface({ input: process.stdin, output: process.stdout })

rl.question('What is your name? ', (name) => { console.log(Hello, ${name}!) rl.close() }) ```

3.2 write

② 使用 write() 方法向标准输出发送数据。

```js import readline from 'readline'

const rl = readline.createInterface({ input: process.stdin, output: process.stdout })

rl.write('Hello, World!\n') rl.close() ```

3.3 prompt

③ 实现一个可多轮对话的命令行

```js const rl = readline.createInterface({ input: process.stdin, // 从标准输入流中读取数据 output: process.stdout // 输出数据到标准输出流中 })

rl.setPrompt('node> ') // 设置提示符 rl.prompt() // 显示提示符

rl.on('line', (line) => { // 监听行事件 switch ( line.trim() // 去除收尾空白字符,进行简单的命令选择判断 ) { case 'hello': console.log('world') // 输出 'world' break case 'exit': rl.close() // 关闭 readline 接口 break default: console.log(Say what? I might have heard '${line.trim()}') // 输出收到的指令 break } rl.prompt() // 显示提示符 })

rl.on('close', () => { // 监听关闭事件 console.log('Goodbye!') // 输出 'Goodbye!' process.exit(0) // 退出 Node.js 进程 }) ```

4 crypto 模块

crypto 模块主要用于加密和解密数据,内置了一些常用的算法。

下面介绍一下 3 个常见用法 哈希值生成加解密随机数生成

4.1 哈希算法

使用 crypto.createHash(algorithm):创建一个新的哈希算法实例,其中 algorithm 是一个支持的哈希算法名称,例如 sha256md5

```js import crypto from 'crypto'

const testStr = 'hello world' const sha256 = crypto.createHash('sha256').update(testStr).digest('hex') console.log(sha256)

const md5 = crypto.createHash('md5').update(testStr).digest('hex') console.log(md5)

const sha512 = crypto.createHash('sha512').update(testStr).digest('hex') console.log(sha512) ```

4.2 加密和解密

crypto.createCipheriv 方法用于创建一个使用指定算法和密钥进行加密的 Cipher 对象,并指定初始化向量 iv

```js import crypto from 'crypto'

// 定义加密算法和密钥,生成随机密码和向量 const algorithm = 'aes-256-cbc' const password = crypto.randomBytes(32) // 生成随机 32 字节的密码 const iv = crypto.randomBytes(16) // 生成随机 16 字节的向量

// 待加密的数据 const data = 'Hello, World!' console.log('Original data:', data)

// 创建加密算法实例 const cipher = crypto.createCipheriv(algorithm, password, iv)

// 使用 update 方法对数据进行加密 let encrypted = cipher.update(data, 'utf8', 'hex') // 加密后的数据以十六进制形式(即字符串)返回 encrypted += cipher.final('hex')

console.log('Encrypted data:', encrypted)

// 创建解密算法实例 const decipher = crypto.createDecipheriv(algorithm, password, iv)

// 使用 update 方法对数据进行解密 let decrypted = decipher.update(encrypted, 'hex', 'utf8') // 返回解密后的字符串 utf8编码 decrypted += decipher.final('utf8')

console.log('Decrypted data:', decrypted) ```

4.3 随机数生成

crypto.randomBytes(size[, callback]):生成具有给定大小的随机数据 (Buffer 类型)。

js console.log(crypto.randomBytes(32).toString('hex')) console.log(crypto.randomBytes(8).toString('hex'))

小结

本节主要介绍了如下 4 个内置模块的简单用法:

当然 Node 中的内置模块远不如此,其它的推荐大家在日后开发中按需查阅文档进行使用。

Node.js v18.16.0 文档[英文 | 中文]。